package com.yudongyang.utils;

import java.util.Calendar;
import java.util.Date;
import java.util.Iterator;

public class DateUtil {

	/**
	 * 获取一个日期，在开始start和结束日期end 之间随机日期
	 * @Title: randomDate 
	 * @Description: TODO
	 * @param start
	 * @param end
	 * @return
	 * @return: Date
	 */
	public static Date randomDate(Date start,Date end) {
		long t1 = start.getTime();	//开始日期的毫秒数
		long t2 = end.getTime();	//结束日期的毫秒数
		
		long t3 =(long) (Math.random()*(t2 -t1 ) + t1);
		
		return new Date(t3);
		
	}
	/**
	* 功能：根据生日计算年龄
	* 示例：现在是2020-4-23，如果生日是2020-5-20，那结果是19
	* 
	* @param Date，生日
	* @return int 年龄
	*/
	public static int getAge(Date birthday){
		//TODO 实现代码
		Calendar c = Calendar.getInstance();
		c.setTime(birthday);  //用生日初始化日历类
		int b_year = c.get(Calendar.YEAR);//生日的年
		int b_month = c.get(Calendar.MONTH);//生日的月
		int b_day = c.get(Calendar.DAY_OF_MONTH);//生日的天
		
        //再获取当前日期的年月日
		Calendar c2 = Calendar.getInstance();//使用系统时间获取Calendar
		
		int now_year = c2.get(Calendar.YEAR);//当前系统的年
		int now_month = c2.get(Calendar.MONTH);//当前系统的月
		int now_day = c2.get(Calendar.DAY_OF_MONTH);//当前月的日期
		
	  //用当前的年月日减去生日的。 例如生日 2000-9-18
		int age=now_year - b_year;
		if(now_month < b_month)//如果还没有到生日月份则年龄-1
			age--;
		else if(now_month == b_month && now_day < b_day)//如果月份,日期没有到则年龄-1
			age --;
		return age;
		
		
	}
	/**
	* 功能：给定时间对象，获取该时间的月初1日0时0分0秒0毫秒
	* 示例：2018-11-11 08:30:16 → 2018-11-01 00:00:00
	* 使用场景：可用在数据库里查询某月的时间范围
	*
	* @param Date 源时间
	* @return Date 月初时间
	*/
	public static Date getFirstDayOfMonth(Date src){
		//TODO 实现代码
		Calendar c = Calendar.getInstance();
		//传入日期初始化日历类
		c.setTime(src);
		c.set(c.get(Calendar.YEAR), c.get(Calendar.MONTH), 1, 0, 0, 0);

		return c.getTime();
	}
	/**
	* 功能：给定时间对象，获取该时间的月末最后一天的23时23分59秒999毫秒
	* 示例：2018-11-11 08:30:16 → 2018-11-30 23:23:59
	* 使用场景：可用在数据库里查询某月的时间范围
	*
	* @param Date 源时间
	* @return Date 月末时间
	*/
	public static Date getLastDayOfMonth(Date src){
		//传入的日期加一个月，然后减一秒
		Calendar c = Calendar.getInstance();
		c.setTime(src);
		c.add(Calendar.MONTH, 1);//让月份加一
		Date time = c.getTime();
		
		Date f = DateUtil.getFirstDayOfMonth(time);
		c.setTime(f);
		c.add(Calendar.SECOND, -1);
		
		return c.getTime();
	}
	/**
	* 功能：获取当前日期指定天数之前或之后的日期，如果参数为负数，则往前回滚。
	* 示例1：当前是2018-08-08，参数days=5，结果是2018-08-13
	* 示例2：当前是2018-08-08，参数days=-4，结果是2018-08-04
	* 
	* @param int days 偏移的天数，如果为负数则往前回滚。
	* @return Date 新日期
	*/
	public static Date offsetDate(int days) {
		//TODO 实现代码
		Calendar c = Calendar.getInstance();
		c.add(Calendar.DAY_OF_MONTH, days);
		return c.getTime();
	}
	/**
	 * 功能：获取指定日期指定天数之前或之后的日期，如果参数为负数，则往前回滚。
	 * 示例1：当前是2018-08-08，参数days=5，结果是2018-08-13
	 * 示例2：当前是2018-08-08，参数days=-4，结果是2018-08-04
	 * 
	 * @param int days 偏移的天数，如果为负数则往前回滚。
	 * @return Date 新日期
	 */
	public static Date offsetDate(Date date,int days) {
		//TODO 实现代码
		Calendar c = Calendar.getInstance();
		c.setTime(date);
		c.add(Calendar.DAY_OF_MONTH, days);
		return c.getTime();
	}
	/**
	* 功能：获取当前季节，如春季、夏季、秋季、冬季。
	* 
	* @return Season 季节
	*/
	public static Season getCurrentSeason() {
		//TODO 实现代码
		Calendar c = Calendar.getInstance();
		int month = c.get(Calendar.MONTH)+1;
		if(month<9 && month>2) {
			if(month<6) {
				return Season.春;
			}else {
				return Season.夏;
			}
		}else {
			if(month<12 && month>8) {
				return Season.秋;
			}else {
				return Season.冬;
			}
		}
		
	}
	/**
	* 功能：获取人性化时间，例如5分钟之内则显示“刚刚”，其它显示16分钟前、2小时前、3天前、4月前、5年前等
	*
	* @param Date date 源时间。
	* @return 人性化时间
	*/
	public static String getDisplayTime(Date date){
		//TODO 实现代码
		long t1 = date.getTime();
		long t2 = new Date().getTime();
		long t3 = t2-t1;
		long m = t3/1000/60;//分钟
		if(m<=5) {
			return "刚刚";
		}else if(m<60) {
			return m+"分钟前";
		}else if(m/60<24) {
			return m/60+"小时前";
		}else if(m/60/24<30) {//天
			return m/60/24+"天前";
		}else if(m/60/24/30<12) {
			return m/60/24/30+"月前";
		}else {
			return m/60/24/365+"年前";
		}
	}
	
	/**
	 * 
	 * @Title: getDiffDay 
	 * @Description: 求两个时间的差值,结果是*年*月*日*分钟格式
	 * @param start
	 * @param end
	 * @return
	 * @return: String
	 */
	public static String getDiffDay(Date start,Date end) {
		
		
		long t1 = start.getTime();
		long t2 = end.getTime();
		long t3 = t2-t1;
		long m = t3/1000/60;//分钟
		return DateUtil.diGui(m);
		
		
	}
	private static String result="";
	public static String diGui(long m) {
		
			 if(m<60) {
				result+= m+"分钟";
				m=0;
			}else if(m/60<24) {
				result+= m/60+"小时";
				m-=(m/60)*60;
			}else if(m/60/24<30) {//天
				result+= m/60/24+"天";
				m-=(m/60/24)*60*24;
			}else if(m/60/24/30<12) {
				result+= m/60/24/30+"月";
				m-=(m/60/24/30)*60*24*30;
			}else {
				result+= m/60/24/365+"年";
				m-=(m/60/24/365)*365*24*60;
			}
			if(m>0) {
				DateUtil.diGui(m);
			}
			
		return result;
		
		
	}

}
